package com.qf.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.netflix.ribbon.proxy.annotation.Hystrix;
import com.qf.fallback.SentinelFallback;
import com.qf.feign.ProviderFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @author lixu
 */
@RestController
@RequestMapping("/customer")
@RefreshScope  //当Nacos配置中心的配置文件发生变化的时候 通过此注解就可以实现不停机维护
public class CustomerController {

    @Autowired
    private ProviderFeign providerFeign;
    @Value("${version}")
    private String version;//Nacos配置中心的配置文件 customer.yml 中的信息

    @Value("${spring.redis.host}")
    private String springRedisHost;

    @GetMapping("/hello")
    public String hello(String id){
        if("123".equalsIgnoreCase(id)){
            int i = 1/0;
        }
        return "我是消费者版本是: "+version+ ":扩展文件:" +springRedisHost+ ":我要调用提供者:" + providerFeign.test1();
    }

    /**
     * 热点控制
     *  @SentinelResource(value = "资源名")
     *    注意： 当同学们使用sentinel的注解的时候 流控或降或热控  就直接抛异常
     *
     *
     *   public String redian(String id,String name){
     *  id:  0索引位置
     *  name: 1索引位置
     *
     *  过年了  要回家了
     *    1、北京开往上海的热点
     *    2、北京开往拉萨
     *
     *fallback = "redian123" : 规则不符就降级处理
     * blockHandler： 抛出阻塞异常就执行的
     */
    @GetMapping("/redian")
    @SentinelResource(value = "/redian",fallback = "redian",// 局部 针对某个资源
      exceptionsToIgnore = {ArithmeticException.class},fallbackClass = SentinelFallback.class,
            defaultFallback = "globalHandler")
    public String redian(String id, String name, Integer age) {//目标方法
        //int i = 1/0;
        return "我是热点控制：id:" + id + ":name:" + name;

    }

    /**
     * 热控之后进行降级处理
     * @param id
     * @param name
     * @param age
     * @return
     */
/*    public String redian123(String id,String name,Integer age){//降级处理方法
        return "我是热点控制的降级处理";

    }*/

    /**
     *
     * @param id
     * @param name
     * @param age
     * @return
     */
    public String redian456(String id,String name,Integer age){
        return "我是热点控制的blockHandler";

    }
}
